import cfg from './config.js'
import { createClient } from 'redis'
import { exec } from 'node:child_process'

/**
 * 初始化全局redis客户端
 */
export default async function redisInit () {
  const rc = cfg.redis
  if (!rc?.open) return
  const redisUn = rc.username || ''
  let redisPw = rc.password ? `:${rc.password}` : ''
  if (rc.username || rc.password) redisPw += '@'
  const redisUrl = `redis://${redisUn}${redisPw}${rc.host}:${rc.port}/${rc.db}`
  let client = createClient({ url: redisUrl })

  try {
    logger.info(`正在连接 ${logger.blue(redisUrl)}`)
    await client.connect()
  } catch (err) {
    logger.error(`Redis 错误：${logger.red(err)}`)

    const cmd = 'redis-server --save 900 1 --save 300 10 --daemonize yes' + await aarch64()
    logger.info('正在启动 Redis...')
    await execSync(cmd)
    await new Promise((resolve) => setTimeout(resolve, 1000))

    try {
      client = createClient({ url: redisUrl })
      await client.connect()
    } catch (err) {
      logger.error(`Redis 错误：${logger.red(err)}`)
      logger.error(`请先启动 Redis：${logger.blue(cmd)}`)
      process.exit()
    }
  }

  client.on('error', async err => {
    logger.error(`Redis 错误：${logger.red(err)}`)
    const cmd = 'redis-server --save 900 1 --save 300 10 --daemonize yes' + await aarch64()
    logger.error(`请先启动 Redis：${cmd}`)
    process.exit()
  })

  /** 全局变量 redis */
  global.redis = client
  logger.info('Redis 连接成功')
  return client
}

async function aarch64 () {
  if (process.platform == 'win32') return ''
  /** 判断arch */
  const arch = await execSync('uname -m')
  if (arch.stdout && arch.stdout.includes('aarch64')) {
    /** 判断redis版本 */
    let v = await execSync('redis-server -v')
    if (v.stdout) {
      v = v.stdout.match(/v=(\d)./)
      /** 忽略arm警告 */
      if (v && v[1] >= 6) return ' --ignore-warnings ARM64-COW-BUG'
    }
  }
  return ''
}

function execSync (cmd) {
  return new Promise((resolve, reject) => {
    exec(cmd, (error, stdout, stderr) => {
      resolve({ error, stdout, stderr })
    })
  })
}
